//#include "LinkList.h"
#include "DoubleLinkList.h"

 using ElementType = void*;

class Student
{
public:
    Student(){}
    Student(int id,std::string name):id(id),name(name){}
    // Student(const Student& s)
    // {
    //     id = s.id;
    //     name = s.name;
    // }
    // Student& operator=(const Student& s)
    // {
    //     id = s.id;
    //     name = s.name;
    //     return *this;
    // }
    friend void Print(ElementType element);
    friend int Compare(ElementType element1 ,ElementType element2);
    friend void Free(ElementType element);
    friend bool Compare1(ElementType element1 ,ElementType element2);
    friend ElementType Copy(void *p);
private:
    int id;
    std::string name;
};

    void Free(ElementType element)
    {
        delete (Student*)element;
    }
    int Compare(ElementType element1 ,ElementType element2)
    {
        Student *stu1 = (Student *)element1;
        Student *stu2 = (Student *)element2;
        return (stu1->id - stu2->id);
    }
   
    void Print(ElementType element)
    {
        Student *stu = (Student *)element;
        std::cout<<stu->id<<" "<<stu->name<<std::endl;
    }
    bool Compare1(ElementType element1 ,ElementType element2)
    {
        Student *stu1 = (Student *)element1;
        Student *stu2 = (Student *)element2;
        return ((stu1->id == stu2->id) && (stu1->name == stu2->name));
    }

// void Print(void *p)
// {
//     std::cout<<*(int*)p<<" "<<std::endl;
// }
    ElementType Copy(void *p)
    {
        Student *s = (Student *)p;
        return s = new Student(s->id,s->name);
    }
int main()
{

    DoubleLinkList list1,list2;
    list1.SetPrint(Print);
    list1.SetCompare(Compare);
    list1.SetFree(Free);
    list1.SetCopy(Copy);

    list2.SetPrint(Print);
    list2.SetCompare(Compare);
    list2.SetFree(Free);
    list2.SetCopy(Copy);
    // LinkList list1,list2;
    // for(int i = 0;i < 10;i++)
    // {
    //     list1.InsertTail(i+1);
    // }()
    Student *stu1 = new Student(3,"zhangsan");
    Student *stu2 = new Student(1,"lisi");
    Student *stu3 = new Student(5,"wangwu");

    // Student *stu4 = new Student(4,"zha");
    // Student *stu5 = new Student(2,"ljjj");
    // Student *stu6 = new Student(6,"kugu");

    // DARRAY::DynamicArray a,b;
    // a.SetPrint(Print);
    // a.SetComepare1(Compare1);
    // a.SetCompare(Compare);
    // a.SetFree(Free);
    // a.SetCopy(Copy);

    // b.SetPrint(Print);
    // b.SetComepare1(Compare1);
    // b.SetCompare(Compare);
    // b.SetFree(Free);
    // b.SetCopy(Copy);

    // a.InsertTail(stu1);
    // a.InsertTail(stu2);
    // a.InsertTail(stu3);
    // b.InsertTail(stu4);
    // b.InsertTail(stu5);
    // b.InsertTail(stu6);
    // //a.InsertTail(stu1);
    // //a.InsertHead(stu2);
    // //a.InserByIndex(stu2,1);
    // //a.RemoveByIndex(1);
    // //a.UpdateByIndex(1,stu1);
    // //a.UpdateByElement(stu1,stu2);
    // DARRAY::DynamicArray c = a.Merge(b);
    // c.SetPrint(Print);
    // c.SetComepare1(Compare1);
    // c.SetCompare(Compare);
    // c.SetFree(Free);
    // c.SetCopy(Copy);
    // c.show();
    // DARRAY::DynamicArray b ;
    // b = a;
    // b.show();
    //Student *stu4 = new Student(2,"Aaa");
    // Student stu5(4,"Bbb");
    // Student stu6(6,"damai");

    list1.InsertTail(stu1);
    list1.InsertTail(stu2);
    list1.InsertTail(stu3);
    list1.InsertTail(stu1);
    list1.show();

    // ElementType *p =  list1.FindByIndex(1);
    // if(p)
    //     std::cout<<" okkk\n";
    // list1.InsertTail(&stu4);
    // list1.InsertTail(&stu5);
    // list1.InsertTail(&stu6);
    // DARRAY::DynamicArray p ;
    // // p.InsertTail(stu1);
    // // p.InsertTail(stu2);
    // // p.InsertTail(stu3);
    // p = list1.FindByElement(stu1);
    // p.SetPrint(Print);
    // p.show();
    // p = list1.FindByElement(stu1);
    // p.SetPrint(Print);
    // p.show();

    // list1.Sort();
    //list1.UpdateByElement(stu1,stu4);
    //list1.RemoveByIndex(1);
    //list1.RemoveByElemnt(stu1);
    //list1.UpdateByIndex(1,&stu3);
    //list1.UpdateByElement(&stu1,&stu6);
    // list1.show();
    //list1 = list1.Merge(list2);
    //list1.show();
   // list1.RemoveByIndex(5);
   // list1.show();
    // list1.show();
    // list2 = list1;
    // list2.show();
    // for(int i = 3;i < 8;i++)
    // {
    //     list2.InsertTail(i+1);
    // }
    // list1.show();
    // ElementType * p = list1.FindByIndex(9);
    // if(p)
    //     std::cout<<*p<<std::endl;
    //list1.FindUnionSet(list2).show();
    //list1.FindDifference(list2).show();
    //list.show();
    // list1.show();
    // ElementType* p =  list1.GetReserveIndex(10);
    // if(p)
    //     std::cout<<*p<<std::endl;


    // LinkList list1;
    // LinkList list2;
    // for(int i = 5;i > 0;i--)
    // {
    //     list1.InsertTail(i);
    //     list2.InsertTail(i+1);
    // }
    // //list1.InsertHead(3);
    // //list1.Sort();
    // list1.show();
    // list1.Sort();
    // list1.show();
    // list1.Reserve();
    // list1.show();
    // list1.Reserve2();
    // list1.show();
    //list2.show();
    
    // list1.Merge(list2).show();
    //list.BuubleSort();
    // list.UpdateByIndex(0,1009);
    // list.UpdateByElement(8,888);
    //list.InsertByIndex(1,99);    
    

    // list.RemoveByElemnt(1);
    // ElementType *p = list.FindByIndex(22);
    // if(p != nullptr)
    //     std::cout<<"找到了："<<*p<<std::endl;
    // DARRAY::DynamicArray a = list.FindByElement(7);
    // a.SetPrint(Print);
    // a.show();
    //list.show();
    return 0;
}